package org.dromara.patrol.domain.vo;

import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.patrol.domain.PatrolSubtaskCommon;
import org.dromara.patrol.domain.model.ExecuteRule;
import org.dromara.patrol.domain.model.PatrolExecutors;

import java.io.Serial;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 巡店管理-普通巡店子任务视图对象 patrol_subtask_common
 *
 * @author han
 * @date 2024-03-30
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = PatrolSubtaskCommon.class)
public class PatrolSubtaskCommonVo implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 子任务id
     */
    @ExcelProperty(value = "子任务id")
    private String id;

    /**
     * 发布者
     */
    @ExcelProperty(value = "发布者")
    private String creator;

    /**
     * 任务名称
     */
    @ExcelProperty(value = "任务名称")
    private String name;

    /**
     * 执行人（接收者）
     */
    @ExcelProperty(value = "执行人", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "接=收者")
    private String userId;

    /**
     * 巡店任务id（巡店管理-巡店任务配置表patrol_task.task_id）
     */
    @ExcelProperty(value = "巡店任务id", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "巡=店管理-巡店任务配置表patrol_task.task_id")
    private String taskId;

    /**
     * 实际执行开始时间
     */
    @ExcelProperty(value = "实际执行开始时间")
    private Long startTime;

    /**
     * 实际执行结束时间
     */
    @ExcelProperty(value = "实际执行结束时间")
    private Long finishTime;

    /**
     * 任务状态（字典表：PROCESSING 执行中，TODO 待处理，FINISH 已完成）
     */
    @ExcelProperty(value = "任务状态", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "字=典表：PROCESSING,执=行中，TODO,待=处理，FINISH,已=完成")
    private String status;

    /**
     * 执行人
     */
    @ExcelProperty(value = "执行人")
    private String executor;

    /**
     * 周期任务id（非主任务必填）
     */
    @ExcelProperty(value = "周期任务id", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "非=主任务必填")
    private String cycleTaskId;

    /**
     * 重复类型（字典表：NO_REPEAT 不重复，DAILY 每天，WEEKLY 每周，MONTHLY 每月）
     */
    @ExcelProperty(value = "重复类型", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "字=典表：NO_REPEAT,不=重复，DAILY,每=天，WEEKLY,每=周，MONTHLY,每=月")
    private String cycleType;

    /**
     * 门店id（main_task 为否必填）
     */
    @ExcelProperty(value = "门店id", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "m=ain_task,为=否必填")
    private String storeId;

    /**
     * 门店ids（main_task 为是必填）
     */
    @ExcelProperty(value = "门店ids", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "m=ain_task,为=是必填")
    private List<String> storeIds;

    /**
     * 计划开始日期：2024-03-07
     */
    @ExcelProperty(value = "计划开始日期：2024-03-07")
    private String executeDateStart;

    /**
     * 计划结束日期：2024-04-30
     */
    @ExcelProperty(value = "计划结束日期：2024-04-30")
    private String executeDateEnd;

    /**
     * 计划执行时间开始：00:00:00
     */
    @ExcelProperty(value = "计划执行时间开始：00:00:00")
    private String executeTimeStart;

    /**
     * 计划执行时间结束：23:59:59
     */
    @ExcelProperty(value = "计划执行时间结束：23:59:59")
    private String executeTimeEnd;

    /**
     * 模板规则（字典表：COMMON 使用统一模板，CUSTOMIZE 巡店时自主选择模板，null 自定义巡店）
     */
    @ExcelProperty(value = "模板规则", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "字=典表：COMMON,使=用统一模板，CUSTOMIZE,巡=店时自主选择模板，null,自=定义巡店")
    private String templateRule;

    /**
     * 巡店模板id（如果 template_rule=COMMON则必填）
     */
    @ExcelProperty(value = "巡店模板id", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "如=果,t=emplate_rule=COMMON则必填")
    private String templateId;

    /**
     * 通知人ids
     */
    @ExcelProperty(value = "通知人ids")
    private List<String> notifierIds;

    /**
     * 主任务（字典表：0 是，1 否）
     */
    @ExcelProperty(value = "主任务", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "字=典表：0,是=，1,否=")
    private String mainTask;

    /**
     * 创建任务时间（巡店管理-巡店任务配置表patrol_task.created_time）
     */
    @ExcelProperty(value = "创建任务时间", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "巡=店管理-巡店任务配置表patrol_task.created_time")
    private Long taskCreatedTime;

    /**
     * 任务类型（字典表：PATROL_REALTIME 实时巡店，PATROL_LIVE 现场巡店，PATROL_VIDEO 录像巡店）
     */
    @ExcelProperty(value = "任务类型", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "字=典表：PATROL_REALTIME,实=时巡店，PATROL_LIVE,现=场巡店，PATROL_VIDEO,录=像巡店")
    private String taskSubType;

    /**
     * 备注
     */
    @ExcelProperty(value = "备注")
    private String remark;

    /**
     * 版本号（字典表：V1，V2）
     */
    @ExcelProperty(value = "版本号", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "字=典表：V1，V2")
    private String ver;

    /**
     * 录像巡店开始时间（task_sub_type=PATROL_VIDEO必填）
     */
    @ExcelProperty(value = "录像巡店开始时间", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "t=ask_sub_type=PATROL_VIDEO必填")
    private Long videoStartTime;

    /**
     * 录像巡店结束时间（task_sub_type=PATROL_VIDEO必填）
     */
    @ExcelProperty(value = "录像巡店结束时间", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "t=ask_sub_type=PATROL_VIDEO必填")
    private Long videoEndTime;

    /**
     * 巡检计划执行人，main_task为是时必填
     */
    @ExcelProperty(value = "巡检计划执行人，main_task为是时必填")
    private List<PatrolExecutors> patrolExecutors;

    /**
     * 任务规则同patrol_task.execute_rule
     */
    @ExcelProperty(value = "任务规则同patrol_task.execute_rule")
    private ExecuteRule executeRule;

    /**
     * 子任务计划结束时间戳（由execute_rule生成每个任务的结束时间）
     */
    @ExcelProperty(value = "子任务计划结束时间戳", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "由=execute_rule生成每个任务的结束时间")
    private Long executeEndTime;

    /**
     * 子任务计划开始时间戳（由execute_rule生成每个任务的开始时间）
     */
    @ExcelProperty(value = "子任务计划开始时间戳", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "由=execute_rule生成每个任务的开始时间")
    private Long executeStartTime;

    /**
     * 过期状态（字典表：NOT_EXPIRED 没过期，ABOUT_TO_EXPIRE 即将过期，IS_EXPIRED 已过期）
     */
    @ExcelProperty(value = "过期状态", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "字=典表：NOT_EXPIRED,没=过期，ABOUT_TO_EXPIRE,即=将过期，IS_EXPIRED,已=过期")
    private String expiredStatus;

    /**
     * 模板策略
     * @see org.dromara.common.core.enums.patrol.template.MarkStrategy;
     */
    private String markStrategy;

    /**
     * ID 对应 名称集合
     */
    private Map<Long, String> nameMap = new HashMap<>();
}
